import {getCookie, setCookie} from "./cookie.js"
import '../libs/element-plus-2.4.2/index.full.js'

const {ElMessage} = ElementPlus

// 请求体或请求参数转url拼接字符串 xxx=xxx&xxx=xx& 形式
function queryStringify(obj) {
    let str = "";
    for (let k in obj) str += `${k}=${obj[k]}&`;
    return str.slice(0, -1);
}

// 封装 ajax
function ajax(options) {
    let defaultOptions = {
        url: "",
        method: "GET", // 默认GET方法
        async: true, // 默认异步执行
        data: {},
        params: {},
        // 默认请求体形式为json形式
        headers: {
            "content-type": "application/json",
        },
        success: function () {
        },
        error: function () {
        },
    };
    let {url, method, async, data, params, headers, success, error} = {
        ...defaultOptions,
        ...options,
    };
    const tempURL = url
    if (
        typeof data === "object" &&
        headers["content-type"]?.indexOf("json") > -1
    ) {
        data = JSON.stringify(data);
    } else if (typeof data === "object" &&// 这里如果是上传文件 content-type 因为不可以直接写 multipart/form-data 后面需要一个 boundary 和值表示发送数据的边界(用于确定文件何时结束 EOF)需要让浏览器发送时自行添加
        headers["content-type"]?.indexOf("form-data") > -1) {
        delete headers["content-type"]
        data = data
    } else {
        data = queryStringify(data);
    }
    // 如果是GET请求,并且有请求参数, 那么直接组装到url地址上
    if (/^get$/i.test(method) && params) url += "?" + queryStringify(params);

    // 创建xhr对象发送请求
    const xhr = new XMLHttpRequest();
    xhr.open(method, url, async);
    xhr.onload = function () {
        if (!/^2\d{2}$/.test(xhr.status)) {
            error(`错误状态码:${xhr.status}`); // 出错回调error方法
            return;
        }

        // 解析响应数据
        try {
            let result = JSON.parse(xhr.responseText);
            success(result); // 解析成功回调success方法
        } catch (err) {
            error("解析失败,请检查后端返回数据形式!");
        }
    };

    // 设置请求头内的信息
    for (let k in headers) xhr.setRequestHeader(k, headers[k]);
    if (tempURL === "login" || tempURL === "register" || tempURL === "mail") {
        if (/^get$/i.test(method)) {
            xhr.send(); // 发送GET请求
        } else {
            xhr.send(data); // 发送其他类型请求
        }
    } else if (getCookie("isLogin") === 'true') {
        setCookie("isLogin", "true", 900)
        if (/^get$/i.test(method)) {
            xhr.send(); // 发送GET请求
        } else {
            xhr.send(data); // 发送其他类型请求
        }
    } else {
        ElMessage.warning("15分钟无操作,登录状态已过期,请重新登录.")
        setTimeout(() => location.href = "../index.jsp", 1000)
    }
}

// promise封装
function pajax(options) {
    // 返回promise对象,ajax请求成功调用success,success又回调promise兑现承诺方法resolve,
    // 最终会调用promise对象的then方法,失败同理依次调用error,回调reject,最终调用catch方法
    return new Promise((resolve, reject) => {
        ajax({
            ...options,
            success(res) {
                resolve(res);
            },
            error(err) {
                reject(err);
            },
        });
    });
}

export {ajax, pajax};
